package com.third.device.mg.serialport.factory.oupaike.product

import com.third.device.mg.serialport.factory.oupaike.BaseOuPaiKeProduct

/**
 * @Date 2022/3/2
 * Description:巴士门
 */
class BusDoorDevice : BaseOuPaiKeProduct() {


    override fun productDescribe(): String = "欧派克智能产品--电动巴士门"

    /**
     * 初始化设备
     * 学习
     */
    fun initDevice(devId:Byte):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        //0x0001  0x01-0xFF，0x00为广播地址，用于查询设备地址
        command[3] = 0x05
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x03
        command[6] = 0x01
        return checkCommand(command)
    }


    /**
     * 初始化设备
     * 学习
     */
    fun bcInitDevice():ByteArray{
        return initDevice(0x00)
    }


    /**
     * 发送广播获取地址
     * broadcast
     */
    fun bcAddress():ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = 0x00
        //0x0001  0x01-0xFF，0x00为广播地址，用于查询设备地址
        command[3] = 0x01
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x01
        return checkCommand(command)
    }


    /**
     * 发送广播获取设备类型
     * broadcast
     * 返回结果:
     * 0x00：未定义
     * 0x01：单磁悬浮门
     * 0x02：磁悬浮对开门
     * 0x03：单平躺门
     * 0x04：双平躺门
     * 0x05：单自由折叠门
     * 0x06：双自由折叠门
     */
    fun bcDeviceType():ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = 0x00
        //0x0001  0x01-0xFF，0x00为广播地址，用于查询设备地址
        command[3] = 0x02
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x01
        return checkCommand(command)
    }

    /**
     * 设置新ID
     */
    fun cbSetDeviceId(newId:Byte):ByteArray{
        val command = getEmptyCommand()
        command[2] = 0x00
        //0x0001  0x01-0xFF，0x00为广播地址，用于查询设备地址
        command[3] = 0x01
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x03
        command[6] = newId
        return checkCommand(command)
    }

    /**
     * 设置新ID
     */
    fun setDeviceId(oldId:Byte ,newId:Byte):ByteArray{
        val command = getEmptyCommand()
        command[2] = oldId
        //0x0001  0x01-0xFF，0x00为广播地址，用于查询设备地址
        command[3] = 0x01
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x03
        command[6] = newId
        return checkCommand(command)
    }


    /**
     * 获取设备类型
     */
    fun getDeviceType(devId:Byte):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        //0x0001  0x01-0xFF，0x00为广播地址，用于查询设备地址
        command[3] = 0x02
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x01
        return checkCommand(command)
    }

    /**
     * 获取设备状态
     * 一共4个Byte，每个Byte对应一扇门共4扇，最低位Byte对应门1
     * 每个Byte的bit0-bit5：
     * 0x00：门初始化中
     * 0x01：门已关闭
     * 0x02：门开启中
     * 0x03：门已打开
     * 0x04：门关闭中
     * 0x05：门暂停
     * Bit6：上锁状态
     * 0：未上锁
     * 1：已上锁
     * Bit7：报警状态
     * 0：无报警
     * 1：有报警
     */
    fun getDeviceState(devId:Byte):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x03
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x01
        return checkCommand(command)
    }

    /**
     * 控制门
     * 0x00：无动作
     * 0x01：开门
     * 0x02：关门
     * 0x03：暂停
     * 0x04：上锁
     * 0x05：解锁
     * @param devId id
     * @param d1 门1动作
     * @param d2 门2动作
     * @param d3 门3动作
     * @param d4 门4动作
     */
    fun controlDoor(devId: Byte ,d1:Byte ,d2:Byte ,d3:Byte ,d4:Byte ):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x04
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x03
        command[6] = d1
        command[7] = d2
        command[8] = d3
        command[9] = d4
        return checkCommand(command)
    }


    /**
     * 获取运行速度
     */
    fun getDeviceSpeed(devId: Byte):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x10
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x01
        return checkCommand(command)
    }


    /**
     * 设置运行速度
     * @param speed 0~ 100
     */
    fun setSpeed(devId: Byte ,speed:Int):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x10
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x03
        command[6] = speed.toByte()
        return checkCommand(command)
    }

    /**
     * 开门时间
     */
    fun getDeviceOpenTime(devId: Byte):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x11
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x01
        return checkCommand(command)
    }

    /**
     * 是否自动关门
     */
    fun getDeviceIsAutoClose(devId: Byte):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x12
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x01
        return checkCommand(command)
    }

    /**
     * 设置是否自动关门
     */
    fun setDeviceAutoClose(devId: Byte ,auto:Boolean):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x12
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x03
        if (auto){
            command[6] = 0x01
        }else{
            command[6] = 0x00
        }

        return checkCommand(command)
    }

    /**
     * 是否开门换向
     */
    fun getDeviceIsReversal(devId: Byte):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x13
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x01
        return checkCommand(command)
    }

    /**
     * 是否开门换向
     */
    fun setDeviceReversal(devId: Byte ,isReversal:Boolean):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x13
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x03
        command[6] = if (isReversal) 1 else 0
        return checkCommand(command)
    }

    /**
     * 是否自动上锁
     */
    fun getDeviceIsAutoLock(devId: Byte):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x14
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x01
        return checkCommand(command)
    }


    /**
     * 是否门头感应
     */
    fun getDeviceIsSense(devId: Byte):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x15
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x01
        return checkCommand(command)
    }



    /**
     * 是否保持力
     */
    fun getDeviceIsForce(devId: Byte):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x16
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x01
        return checkCommand(command)
    }

    /**
     * 是否中门同步
     */
    fun getDeviceIsSyncCenter(devId: Byte):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x17
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x01
        return checkCommand(command)
    }

    /**
     * 设置中门同步
     */
    fun setSyncCenter(devId: Byte, sync:Boolean):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x17
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x03
        command[6] = if (sync) 0x01 else 0x00
        return checkCommand(command)
    }


    /**
     * 是否边门同步
     */
    fun getDeviceIsSyncSide(devId: Byte):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x18
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x01
        return checkCommand(command)
    }

    /**
     * 设置边门同步
     */
    fun setSyncSide(devId: Byte, sync:Boolean):ByteArray{
        val command = getEmptyCommand()
        //0x00代表广播地址
        command[2] = devId
        command[3] = 0x18
        //command[4] = 0x00
        //Cmd   0x01：读出    0x02：应答   0x03：写入
        command[5] = 0x03
        command[6] = if (sync) 0x01 else 0x00
        return checkCommand(command)
    }

}